http://www.roboforum.ru/viewtopic.php?f=2&t=4548

LCD  CVAVR      

     WinAVR      BASCOM


//****************************************************************************************************
//************************************    my_lcd.c    ************************************************
//****************************************************************************************************
//************************************    .     ************************************************
//****************************************************************************************************

//1.           " #include <my_lcd.c> "
//2.   LCD     .

#include <io.h>
#include <delay.h>

//****************************************************************************************************
//****************************    LCD  *******************************************
//****************************************************************************************************

#define COLUMNS 16  //   

#define EN PORTB.2
#define RS PORTB.0
#define LCD_PD4 PORTB.4
#define LCD_PD5 PORTB.5
#define LCD_PD6 PORTC.1
#define LCD_PD7 PORTC.0

//****************************************************************************************************
//****************************************************************************************************
//****************************************************************************************************
#define COMAND   0   // 
#define DATA   1   // 
#define lcd_delay 1 // , 

#pragma used+

//
void lcd_write(unsigned char data, unsigned char mode);
void lcd_init(void);
void lcd_putchar(unsigned char data);              //  1    ( + 1)
void lcd_gotoxy(unsigned char x, unsigned char y); //   1  x -  =0..39 y -  =0..3
void lcd_clear(void);                              //  LCD
void lcd_puts(char *str);                          //     SRAM  LCD
void lcd_putsf(char flash *str);                   //     FLASH  LCD
void lcd_cursor_on(void);
void lcd_cursor_off(void);
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to);//      
//****************************************************************************************************


flash unsigned char base_y[4]={0x80,0xc0,0x80+COLUMNS,0xc0+COLUMNS};//   1  2 
unsigned char lcd_x, lcd_y;              //      

//****************************************************************************************************

void lcd_write(unsigned char data, unsigned char mode){

if (mode)RS = 1;else RS = 0;   //  1-data 0-comand

delay_us(lcd_delay);

//  
if (data & (1<<7)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<6)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<5)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<4)) LCD_PD4=1; else LCD_PD4=0;

EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);

// 
if (data & (1<<3)) LCD_PD7=1; else LCD_PD7=0;
if (data & (1<<2)) LCD_PD6=1; else LCD_PD6=0;
if (data & (1<<1)) LCD_PD5=1; else LCD_PD5=0;
if (data & (1<<0)) LCD_PD4=1; else LCD_PD4=0;

EN = 1;
delay_us(lcd_delay);
EN = 0;
delay_us(lcd_delay);

LCD_PD7=1; LCD_PD6=1; LCD_PD5=1; LCD_PD4=1;
delay_ms(lcd_delay);
}//lcd_write()

//****************************************************************************************************

void lcd_init(){
RS=0;
EN=0;
delay_ms(200);
lcd_write(0x33, COMAND);
delay_ms(5);
lcd_write(0x32, COMAND);
lcd_write(0x28, COMAND); // 4 , 2 
lcd_write(0x08, COMAND); //   
lcd_write(0x01, COMAND); //  
lcd_write(0x06, COMAND); //   
lcd_write(0x0C, COMAND); //  ,  
lcd_clear();
}//lcd_init();

//****************************************************************************************************

void lcd_gotoxy(unsigned char x, unsigned char y){
if (y<=3)lcd_write((base_y[y]+lcd_x),COMAND);
else lcd_write((base_y[0]+lcd_x),COMAND);
lcd_x=x;
lcd_y=y;
}//lcd_gotoxy()

//****************************************************************************************************

//   LCD
void lcd_clear(void){
lcd_write(2,COMAND);   // cursor home
lcd_write(0x0c,COMAND); // cursor off
lcd_write(1,COMAND);   // clear
lcd_x=lcd_y=0;
}//lcd_clear()

//****************************************************************************************************

//      
void lcd_clear_string(unsigned char y,unsigned char from,unsigned char to){

while(from <= to){
        lcd_gotoxy(from++,y);
        lcd_putchar(' ');
};//while

}//lcd_clear_string()

//****************************************************************************************************

void lcd_cursor_on(){
lcd_write(0x0d,COMAND);
}//lcd_cursor_on()

//****************************************************************************************************

void lcd_cursor_off(){
lcd_write(0x0c,COMAND);
}//lcd_cursor_off()

//****************************************************************************************************

void lcd_putchar(unsigned char data){
if (lcd_x>(COLUMNS-1)){
        if (++lcd_y>3)lcd_y=0;
        lcd_x=0;
};//if
lcd_gotoxy(lcd_x,lcd_y);
lcd_write(data, DATA);
lcd_x++;
}//lcd_putchar();

//****************************************************************************************************

//     SRAM  LCD
void lcd_puts(char *str){
while(*str)lcd_putchar(*str++);//  
}//lcd_puts()

//****************************************************************************************************

//     FLASH  LCD
void lcd_putsf(char flash *str){
while(*str)lcd_putchar(*str++);//  
}//lcd_putsf()

//****************************************************************************************************

#pragma used-
